package com.xinz.srmi.impl;
//package com.ppsea.srmi.impl;
//
//import java.lang.reflect.Method;
//import java.net.InterfaceAddress;
//import java.util.Hashtable;
//
//import com.ppsea.srmi.IndexMap;
//import com.ppsea.srmi.NativeInterfaceProvider;
//import com.ppsea.srmi.ServiceException;
//import com.ppsea.srmi.Session;
//import com.ppsea.srmi.SessionDemand;
///**
// * 自动实例的接口实现提供器<br>
// * 通过addClass和bindImpl方法绑定接口类型和实现类型
// * 在需要提供接口实现的时候会自动初始化一个实现类型的实例，默认的实现策略是：
// * Strategy.session
// * 
// * @author xingyun
// *
// */
//public class AutoInstanceInterfaceProvider extends AbstractInterfaceProvider{
//	Hashtable<Class<?>, Class<?>> implementClassesTable = new Hashtable<Class<?>, Class<?>>();
//	static Hashtable<Class<?>, Object> singletonTable = new Hashtable<Class<?>, Object>();
//	//自动生成类型的策略枚举
//	public enum Strategy{
//		request,//
//		session,
//		singleton,
//	}
//	Strategy strategy;
//	public AutoInstanceInterfaceProvider(Class<?>...classes) {
//		this(Strategy.session, classes);
//	}
//	public AutoInstanceInterfaceProvider(Strategy strategy,Class<?>...classes) {
//		this.strategy = strategy;
//		addClass(classes);
//	}
//	public void addClass(Class<?>...classes){
//		for(Class<?> clazz:classes){
//			addClass(clazz);
//		}
//	}
//	/**
//	 * 添加一个可以提供远程调用的实现类
//	 * 将会把所有实现的接口和自己绑定
//	 * @param clazz
//	 */
//	public void addClass(Class<?> clazz){
//		assert !clazz.isInterface():"不能添加接口:"+clazz;
//		Class<?> interfaces[] = clazz.getInterfaces();
//		assert interfaces.length>0:"类型"+clazz+"没有实现任何接口...";
//		for(int i=0;i<interfaces.length;i++){
//			bindImpl((Class)interfaces[i], (Class)clazz);
//		}
//	}
//	/**
//	 * 给接口绑定具体的本地实现，以供远程调用
//	 * @param interfaceClass
//	 * @param implementClass
//	 */
//	public<I,C extends I> void bindImpl(Class<I> interfaceClass,Class<C> implementClass){
//		implementClassesTable.put(interfaceClass, implementClass);
//		addInterface(interfaceClass);
//	}
//	
//	
//	
//	@Override
//	public Object provideImpl(Session session,Method method) throws InstantiationException, IllegalAccessException {
//		Class<?> implClass = implementClassesTable.get(method.getDeclaringClass());
//		if(implClass==null){
//			throw new ServiceException("没有找到类型："+method.getDeclaringClass()+"对应的实现。。");
//		}
//		Object result = null;
//		switch (strategy) {
//		case request:
//			result = implClass.newInstance();
//			session.setSessionData(implClass, result);
//			break;
//		case session:
//			result = session.getSessionData(implClass);
//			if(result==null){
//				result = implClass.newInstance();
//				session.setSessionData(implClass, result);
//				if(result instanceof SessionDemand){
//					((SessionDemand)result).setSession(session);
//				}
//			}
//			break;
//		case singleton:
//			synchronized (singletonTable) {
//				result = singletonTable.get(implClass);
//				if(result==null){
//					result = implClass.newInstance();
//					singletonTable.put(implClass, result);
//					if(result instanceof SessionDemand){
//						//这个时候已经没有必要设置session了
//					}
//				}
//			}
//			
//			break;
//		default:
//			break;
//		}
//		
//		return result;
//	}
//
//}
